package airthmetic.exercise.string;


import java.util.HashSet;

/**
 * 给你一个字符串 s ，根据下述规则反转字符串：
 * <p>
 * 所有非英文字母保留在原有位置。
 * 所有英文字母（小写或大写）位置反转。
 * 返回反转后的 s 。
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "ab-cd"
 * 输出："dc-ba"
 * 示例 2：
 * <p>
 * 输入：s = "a-bC-dEf-ghIj"
 * <p>
 * <p>
 * <p>
 * 输出："j-Ih-gfE-dCba"
 * 示例 3：
 * <p>
 * 输入：s = "Test1ng-Leet=code-Q!"
 * 输出："Qedo1ct-eeLg=ntse-T!"
 *
 *错误：
 * 输入
 * s =
 * "a-bC-dEf-ghIj"
 * 输出
 * "j-Ih-g -fEdCba"
 * 预期结果
 * "j-Ih-g fE-dCba"
 */
public class _917_仅仅反转字母 {

    public String reverseOnlyLetters(String s) {
        HashSet<Character> set = new HashSet<>();
        for (char c = 'a'; c <= 'z'; c++) {
            set.add(c);
        }
        for (char c = 'A'; c <= 'Z'; c++) {
            set.add(c);
        }

        int right = s.length() - 1;
        int left = 0;
        char[] charArray = s.toCharArray();
        while (left <= right) {
            if (!set.contains(charArray[left])) {
                left++;
                continue;
            } else if(!set.contains(charArray[right])) {
                right--;
                continue;
            }else{
                swap(charArray,left++,right--);
            }
        }
        return new String(charArray);

    }

    public void swap(char[] charArray, int left, int right){
        if(left == right){
            return;
        }
        charArray[left] ^= charArray[right];
        charArray[right] ^= charArray[left];
        charArray[left] ^= charArray[right];

    }
}
